package szoftlab4sunak;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;

//A palya alapveto epito eleme, lehet ut is, amelyen az Enemy-k haladhatnak es Trap-et rakhatunk ra
// vagy lehet nem ut, ez esetben Tower helyezheto ra
public class Cell {
	
	public HashMap<Integer, Enemy> enemies; // a rajta levo Enemy-k tarolasara szolgal
	public Cell[] cellstore; // a szomszedos Cell-eket tarolja
	public BattleDevice battledevice; // a Cell-en levo BattleDevice-t tartalmazza
	private boolean Road; // ez az ertek hatarozza meg, hogy a Cell ut-e
	boolean isLast; // ez az ertek hazatorra meg, hogy a Cell az utolso Cell-e, amelyre ha egyetlen Enemy is eljut, a jateknak vege
	private int ID; // ez az ertek tartalmazza a cella ID-jat, ami egyben kulcs is az adott cellahoz
	private char croad; // karakter tipusu segedvaltozo
	private int nb; // a szomszedossagi viszonyokhoz tarol darabszamot
	boolean isStart; // start mezo-e
	ArrayList<String> op; // fajlba iratast segito string
	private int x; // a cella x koordinataja
	private int y; // a cella y koordinataja
	
	// konstruktor
	public Cell() {
		battledevice = null;
	}
	
	/**
	 * @param id: a cella ID-ja
	 * @param isroad: megadja, hogy a cella ut-e
	 */
	// konstruktor
	public Cell(int id, boolean isroad, ArrayList<String> op) {
		//Megfelelo parameterek inicializalasa
		enemies = new HashMap<Integer, Enemy>();
		battledevice = null;
		cellstore = new Cell[8];
		nb = 0;
		ID = id;
		this.op=op;
		Road = isroad;
		if(Road)
			croad = 'R';
		else
			croad = 'F';
		
		if(id!=0){
		// cella koordinatak kiszamolasa
		if(id % 6 != 0) {
			y = (id / 6) * 100;
			x = ((id % 6)-1) * 100;
		}
		else {
			x = 500;
			y = (id-1)/6 * 100;
		}
		}
		
		
		//Teszt kiirasa
		if(id != 0)
			//Kiiratjuk fajlba
			op.add("NC - A " + ID + " id-u es " + croad + " tipusu Cell letrejott.");
	}
	
	//visszaadja az ellenfel id-jat
	public int getID() {
		return ID;
	}


	/**
	 * @param neighbourCell: a beallitando szomszedos cella
	 */
	public void initNeighbour(Cell neighbourCell){
		// beallitjuk a szomszedot az aktualis helyre
		cellstore[nb] = neighbourCell;
		nb++;
	}
	// a pozicio x koordinatajat adja vissza
	public int getPosX(){
		return this.x;
	}
	// a pozicio y koordinatajat adja vissza
	public int getPosY(){
		return this.y;
	}
	
	//Visszaadja a Cell szomszedait
	public Cell[] getNeighbours(){		
		return cellstore;	
		
	}
	
	//Megadja, hogy a Cell Road-e
	public boolean isRoad(){
		return Road;
	}
	
	//Ez a fuggveny tavolitja el a parameterkent atadott Enemy-t errol a Cell-rol
	public void moveFrom(Enemy e1){
		enemies.remove(e1.getID());
	}
	
	//Ez a fuggveny mozgatja erre a Cell-re a parameterkent megadott Enemy-t
	public void moveTo(int id, Enemy e1){
		enemies.put(id, e1);
		// ha van a cellan trap
		if(battledevice != null){
			// ha van a trap-en ko
			if(battledevice.haveStone())
				e1.waitTime(2);
			else
				e1.waitTime(1);
		}
	}
	
	//Ennek a fuggvenynek a segitsegevel dontjuk el, hogy a Cell utolso-e, ha igen, akkor vege a jateknak, az Enemy-k egyike celba ert
	public boolean isLastCell(){
		return isLast;
	}
	
	//Ez a fuggveny adja meg, hogy a Cell-en van-e mar BattleDevice
	public boolean isEmpty(){
		if(battledevice == null)
			return false;
		else
			return true;
	}
		
	//A parameterkent atadott BattleDevice-ot rahelyezzuk a Cell-re
	public void putBattledevice(BattleDevice bd, char bdType, int bdid){
		//trap lerakas
		if(croad == 'R' && bdType == 'R') {
			battledevice = bd;
			//Kiiratjuk fajlba
			op.add("CTR - Trap " + bdid + " id-val lerakva a " + ID + " Cell-re.");
		}
		//tower lerakas
		if(croad == 'F' && bdType == 'O') {
			battledevice = bd;
			//Kiiratjuk fajlba
			op.add("CTO - Tower " + bdid + " id-val lerakva a " + ID + " Cell-re.");
		}
	}
	
	//Visszaadjuk a Cell-en levi BattleDevice-ot
	public BattleDevice getBattleDevice() {
		return battledevice;
	}
	
	// visszaadja a cell-en tartozkodo enemy-ket
	public HashMap<Integer, Enemy> haveEnemy(){
		return enemies;
	}
	
	//cella parameterek beallitasa
	public void setParameters(boolean last, boolean start) {
		this.isLast = last;
		this.isStart = start;
		
	}
	
	// megadja, hogy van-e a cellan battledevice
	public boolean isBattleDevice(){
			if (this.battledevice == null) {
				return false;
			}
			else{
				return true;
			}
	}
}